#include <iostream>
#include <QtGui>
#include "fenetreimage.h"
#include "ui_fenetreimage.h"
#include "actionfichier.h"
#include "taillenouveau.h"

ActionFichier::ActionFichier(MainWindow *parent) :
    QWidget(parent)
{
    mainWindow = parent;
}

ActionFichier::~ActionFichier()
{
}

void ActionFichier::connect(Ui::MainWindow* ui) {
    QObject::connect(ui->actionNouveau, SIGNAL(triggered()),this, SLOT(ActionNouveau()));
    QObject::connect(ui->actionOuvrir, SIGNAL(triggered()), this, SLOT(ActionOuvrir()));
    QObject::connect(ui->actionSauvegarder, SIGNAL(triggered()), this, SLOT(ActionSauvegarder()));
    QObject::connect(ui->actionSauvegarder_sous, SIGNAL(triggered()), this, SLOT(ActionSauvegarderSous()));
    QObject::connect(ui->actionAnnuler, SIGNAL(triggered()), this, SLOT(actionAnnuler()));
    QObject::connect(ui->actionRefaire,SIGNAL(triggered()),this,SLOT(actionRefaire()));
}



void ActionFichier::ActionNouveau()
{
    //On demande la taille de l'image
    TailleNouveau *taille = new TailleNouveau(this);
    int res = taille->exec();

    if (res == QDialog::Accepted) {
        //si l utilisateur a fait "OK"

        //On l'ajoute   la liste des fenetres du pgm
        QImage::Format format= QImage::Format_ARGB32; // valeurs par defaut

        //On créé une nouvelle fenetre et on affiche l'image
        Calque *imageVide = new Calque(taille->largeur,taille->hauteur,format);

        QPainter painter(imageVide);
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.fillRect(imageVide->rect(), QColor(255, 255, 255, 0));

        FenetreImage *fenetreImage= new FenetreImage(mainWindow,imageVide);
        fenetreImage->show();
    }

    delete taille;
}

void ActionFichier::ActionOuvrir(){
    //selection de l'image
    QString* selectedImage = new QString;
    *selectedImage = QFileDialog::getOpenFileName(this, "Ouvrir une image", QString(), "Images (*.png *pnm *.gif *.jpg *.jpeg *.bmp *.pgm)");
    //affichage de l'image

    if(!selectedImage->isEmpty()){
        //si l utilisateur a selectionne une image on la charge
        Calque* image = new Calque;
        image->load(*selectedImage);
        image->updateInfo();

        FenetreImage *fenetreImage= new FenetreImage(mainWindow, image,*selectedImage);
        fenetreImage->show();
    } else {
        //std::cout << "Pas d'image selectionne" << std::endl;
    }

    delete selectedImage;
}

void ActionFichier::ActionSauvegarder(){
    FenetreImage *fenetreImage =(FenetreImage*)mainWindow->getMdiArea()->activeSubWindow()->widget();
    if(fenetreImage->nom.compare("Nouvelle_Image") == 0){
        ActionSauvegarderSous(fenetreImage->nom);
    }
    else{
        QGraphicsView* view = fenetreImage->getMonUi()->VueImage;
        fenetreImage->fond->hide();
        QPixmap pixMap = QPixmap::grabWidget(view);
        pixMap.save(fenetreImage->chemin);
        fenetreImage->fond->show();
        //fenetreImage->imageFenetre->save(fenetreImage->chemin,0,-1);
    }
    fenetreImage->a_ete_modifie = false;
}

int ActionFichier::ActionSauvegarderSous(QString nom){
    FenetreImage *fenetreImage =(FenetreImage*)mainWindow->getMdiArea()->activeSubWindow()->widget();

    //l utilisateur rentre le nom de son image
    QString* nomImage = new QString;
    QFileDialog dialog;
    dialog.setDefaultSuffix("png");
    *nomImage=dialog.getSaveFileName(this,"Sauvegarder l'image", nom , tr("Images(*.png *pnm *.gif *.jpg *.jpeg *.bmp)"));

    if(dialog.Accepted && !nomImage->isEmpty()){
        QFileInfo f( *nomImage );
        //extention par defaut
        if (f.suffix().isEmpty())
        {
            nomImage->append(".png");
        }
        //on recupere l image et on l enregistre au niveau nom
        QGraphicsView* view = fenetreImage->getMonUi()->VueImage;
        fenetreImage->fond->hide();
        QPixmap pixMap = QPixmap::grabWidget(view);

        if(!pixMap.save(*nomImage)){
            fenetreImage->fond->show();

            delete nomImage;

            return SAUVEGARDE_RATEE; //sauvegarde raté
        }else{
            fenetreImage->fond->show();
            fenetreImage->a_ete_modifie = false;
            delete nomImage;

            return SAUVEGARDE_REUSSIE; //sauvegarde reussi
        }
    }else{
        delete nomImage;

        return SAUVEGARDE_ANNULEE; //sauvegarde annulé
    }
    delete nomImage;
    return SAUVEGARDE_RATEE;
}

bool ActionFichier::ActionFermerImage(FenetreImage * fenetreImage){
    QMdiSubWindow *sousFenetre = mainWindow->getMdiArea()->activeSubWindow();

    QString titre = " Fermer ";
    titre.append(fenetreImage->chemin);
    QString texte = "L'image ";
    texte.append(fenetreImage->nom);
    texte.append(" n'a pas ete Sauvegardee.\n Voulez-vous la sauvegarder?");
    QMessageBox question;
    int reponse= question.question(this,titre, texte, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);

    if(reponse==QMessageBox::Yes){
        mainWindow->getMdiArea()->setActiveSubWindow(sousFenetre);
        if(ActionSauvegarderSous(fenetreImage->chemin)==SAUVEGARDE_ANNULEE){
            return false;
        }
    }else if(reponse==QMessageBox::Cancel){
        return false;
    }
    return true;
}


///////////////////////////////////////////////////////
///////// EDITION
///////////////////////////////////////////////////////


void ActionFichier::actionAnnuler() {
    QMdiSubWindow *sousFenetre = mainWindow->getMdiArea()->activeSubWindow();
    FenetreImage* fi = (FenetreImage*) sousFenetre->widget();

    ElementHistorique* elm = fi->historique.annuler();

    //on change l'image
    fi->changerCalqueCourant(elm->getImage());
}

void ActionFichier::actionRefaire() {
    QMdiSubWindow *sousFenetre = mainWindow->getMdiArea()->activeSubWindow();
    FenetreImage* fi = (FenetreImage*) sousFenetre->widget();

    ElementHistorique* elm = fi->historique.refaire();

    //on change l'image
    fi->changerCalqueCourant(elm->getImage());
}
